package com.chushouya.product.service.admin.impl;

import com.chushouya.product.dto.admin.tempevaluate.*;
import com.general.framework.core.lang.Beans;
import com.general.framework.core.lang.Check;
import com.general.framework.core.lang.Lists;
import com.general.framework.core.schema.PageResult;
import com.chushouya.product.dao.entity.SkuEvaluateItemEntity;
import com.chushouya.product.dao.entity.SkuEvaluateItemValueEntity;
import com.chushouya.product.dao.entity.TempEvaluateEntity;
import com.chushouya.product.dao.entity.TempEvaluateItemEntity;
import com.chushouya.product.dao.entity.TempEvaluateItemValueEntity;
import com.chushouya.product.dao.repository.SkuEvaluateItemRepository;
import com.chushouya.product.dao.repository.SkuEvaluateItemValueRepository;
import com.chushouya.product.dao.repository.TempEvaluateRepository;
import com.chushouya.product.dao.repository.TempEvaluateItemRepository;
import com.chushouya.product.dao.repository.TempEvaluateItemValueRepository;
//=====product.dto.admin.tempevaluate.*;
import com.chushouya.product.dto.admin.tempevaluate.*;
import com.chushouya.product.service.admin.TempEvaluateService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 模板估价业务实现
 */
@Service
public class TempEvaluateServiceImpl implements TempEvaluateService {

    @Resource
    private TempEvaluateRepository tempEvaluateRepository;
    
    @Resource
    private SkuEvaluateItemRepository skuEvaluateItemRepository;
    
    @Resource
    private SkuEvaluateItemValueRepository skuEvaluateItemValueRepository;
    
    @Resource
    private TempEvaluateItemRepository tempEvaluateItemRepository;
    
    @Resource
    private TempEvaluateItemValueRepository tempEvaluateItemValueRepository;

    @Override
    public PageResult<TempEvaluateListDTO> selectTempEvaluatePageResult(TempEvaluateQuery query) {
        Check.notNull(query, "查询参数不能为空");
        
        PageResult<TempEvaluateEntity> pageResult = tempEvaluateRepository.selectPageResult(query);
        return PageResult.of(pageResult, TempEvaluateListDTO.class);
    }

    @Override
    public List<TempEvaluateListDTO> selectTempEvaluateList(TempEvaluateQuery query) {
        Check.notNull(query, "查询参数不能为空");
        
        List<TempEvaluateEntity> list = tempEvaluateRepository.selectList(query);
        return Beans.copyList(list, TempEvaluateListDTO.class);
    }

    @Override
    public TempEvaluateDetailDTO getTempEvaluateDetail(Long tempId) {
        Check.notNull(tempId, "模板ID不能为空");
        
        TempEvaluateEntity entity = tempEvaluateRepository.selectByPrimaryKey(tempId);
        Check.notNull(entity, "模板估价不存在");
        
        return Beans.copy(entity, TempEvaluateDetailDTO.class);
    }

    @Override
    public Long addTempEvaluate(TempEvaluateSaveDTO tempEvaluate) {
        Check.notNull(tempEvaluate, "模板估价信息不能为空");
        Check.notNull(tempEvaluate.getCategoryId(), "分类ID不能为空");
        Check.notNull(tempEvaluate.getTempName(), "模板名称不能为空");
        final Long productId = tempEvaluate.getProductId();
        
        
        TempEvaluateEntity entity = Beans.copy(tempEvaluate, TempEvaluateEntity.class);
        entity.setCreateTime(new Date());
        
        tempEvaluateRepository.insertSelective(entity);

        // 根据productId复制SKU评估项目和值到模板表
        if (productId != null) {
            copySkuEvaluateToTemplate(productId, entity.getTempId());
        }

        return entity.getTempId();
    }

    @Override
    public Long editTempEvaluate(TempEvaluateUpdateDTO tempEvaluate) {
        Check.notNull(tempEvaluate, "模板估价信息不能为空");
        Check.notNull(tempEvaluate.getTempId(), "模板ID不能为空");
        
        TempEvaluateEntity existEntity = tempEvaluateRepository.selectByPrimaryKey(tempEvaluate.getTempId());
        Check.notNull(existEntity, "模板估价不存在");
        
        TempEvaluateEntity entity = Beans.copy(tempEvaluate, TempEvaluateEntity.class);
        
        tempEvaluateRepository.updateByPrimaryKeySelective(entity);
        return entity.getTempId();
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void removeTempEvaluate(Long tempId) {
        Check.notNull(tempId, "模板ID不能为空");
        
        // 1. 使用selectOne验证模板是否存在
        TempEvaluateQuery tempQuery = new TempEvaluateQuery();
        tempQuery.setTempId(tempId);
        TempEvaluateEntity existEntity = tempEvaluateRepository.selectOne(tempQuery);
        Check.notNull(existEntity, "模板估价不存在");
        
        // 2. 查询该模板下的所有估价项目
        TempEvaluateItemQuery itemQuery = new TempEvaluateItemQuery();
        itemQuery.setTempId(tempId);
        List<TempEvaluateItemEntity> tempItemList = tempEvaluateItemRepository.selectList(itemQuery);
        
        if (Lists.isNotEmpty(tempItemList)) {
            // 3. 批量删除所有估价项目选项值
            for (TempEvaluateItemEntity tempItem : tempItemList) {
                tempEvaluateItemValueRepository.deleteByTempItemId(tempItem.getTempItemId());
            }
            
            // 4. 批量删除所有估价项目
            tempEvaluateItemRepository.deleteByTempId(tempId);
        }
        
        // 5. 删除模板主记录
        tempEvaluateRepository.deleteByTempId(tempId);
    }

    @Override
    public List<TempEvaluateListDTO> selectTempEvaluateListByCategoryId(Long categoryId) {
        Check.notNull(categoryId, "分类ID不能为空");
        
        TempEvaluateQuery query = new TempEvaluateQuery();
        query.setCategoryId(categoryId);
        
        List<TempEvaluateEntity> list = tempEvaluateRepository.selectList(query);
        return Beans.copyList(list, TempEvaluateListDTO.class);
    }
    
    /**
     * 根据productId复制SKU评估项目和值到模板表
     * @param productId 商品ID
     * @param tempId 模板ID
     */
    private void copySkuEvaluateToTemplate(Long productId, Long tempId) {
        // 1. 读取SKU评估项目
        List<SkuEvaluateItemEntity> skuItems = skuEvaluateItemRepository.selectListByProductId(productId);
        if (Lists.isEmpty(skuItems)) {
            return;
        }
        
        // 2. 复制SKU评估项目到模板表
        List<TempEvaluateItemValueEntity> batchTempItemValues = Lists.newArrayList();
        
        for (SkuEvaluateItemEntity skuItem : skuItems) {
            TempEvaluateItemEntity tempItem = new TempEvaluateItemEntity();
            tempItem.setTempId(tempId);
            tempItem.setItemId(skuItem.getItemId());
            tempItem.setItemName(skuItem.getItemName());
            tempItem.setSelectType(skuItem.getSelectType());
            tempItem.setSort(skuItem.getSort());
            
            // 保存模板评估项目
            tempEvaluateItemRepository.insertSelective(tempItem);
            
            // 3. 读取并复制对应的SKU评估项目值
            List<SkuEvaluateItemValueEntity> skuItemValues = skuEvaluateItemValueRepository.selectListBySkuItemId(skuItem.getSkuItemId());
            if (Lists.isNotEmpty(skuItemValues)) {
                for (SkuEvaluateItemValueEntity skuItemValue : skuItemValues) {
                    TempEvaluateItemValueEntity tempItemValue = new TempEvaluateItemValueEntity();
                    tempItemValue.setTempItemId(tempItem.getTempItemId()); // 使用新生成的temp_item_id
                    tempItemValue.setValueId(skuItemValue.getValueId());
                    tempItemValue.setValueName(skuItemValue.getValueName());
                    tempItemValue.setValue(skuItemValue.getValue());
                    tempItemValue.setCalcType(skuItemValue.getCalcType());
                    tempItemValue.setSort(skuItemValue.getSort());
                    
                    // 添加到批量插入列表
                    batchTempItemValues.add(tempItemValue);
                }
            }
        }
        
        // 4. 批量保存模板评估项目值
        if (Lists.isNotEmpty(batchTempItemValues)) {
            tempEvaluateItemValueRepository.insertList(batchTempItemValues);
        }
    }
}
